hhkb
컴퓨터과학

어셈블리_06_ELF(Executable and Linkable Format) 파일 구조

작성자 : Heehyeon Yoo|2025-10-13
# Assembly# ELF# Linux# Binary Format

리눅스 환경의 실행 파일, 목적 파일(.o), 공유 라이브러리(.so)는 모두 ELF(Executable and Linkable Format) 형식을 따른다. 바이너리 분석을 위해 이해해야 할 핵심 구조는 다음과 같다.

1. ELF 헤더(Header)

파일의 가장 앞부분에 위치하며, 아키텍처, 엔디안, 그리고 진입점(Entry Point) 정보를 담고 있다.
readelf -h 명령어로 확인할 수 있다.

$ readelf -h ./hello
Entry point address: 0x401000

Entry Point는 프로그램이 메모리에 로드된 후 최초로 실행될 명령어의 주소를 나타내며, 분석의 시작점이 된다.

2. 섹션(Section)과 세그먼트(Segment)

  • 섹션(Section): 코드(.text), 데이터(.data) 등 논리적인 역할에 따라 데이터를 분류한 단위. 링킹 과정에서 중요하게 사용된다. (readelf -S로 확인)
  • 세그먼트(Segment): 운영체제가 파일을 메모리에 로드할 때 사용하는 단위. 권한(읽기/쓰기/실행)이 같은 섹션들을 묶어서 처리한다.(readelf -l로 확인)

3. 주요 섹션과 권한

보안 분석 시 눈여겨보아야 할 주요 섹션은 다음과 같다.

  • .text: 실행 코드가 저장되는 영역. 읽기(R)와 실행(X) 권한만 부여된다. 실행 중 수정이 불가능하므로, 코드 패치는 파일 자체를 수정해야 한다.
  • .data: 초기화된 전역 변수 영역. 읽기(R)와 쓰기(W) 권한이 있다.
  • .rodata: 상수 문자열 등이 저장되는 영역. 읽기(R) 전용이다.

최근 운영체제는 데이터 영역(data, stack, heap)에서의 코드 실행을 방지하기 위해 NX(No-Execute) 비트를 설정한다.